#ifndef LISTWRAP_H_INCLUDED
#define LISTWRAP_H_INCLUDED

#include "List.h"

#define GENERATE_LIST_HEADER(X)             \
typedef struct X##List_t X##List;           \
\
X##List* X##ListNew(void);                  \
void X##ListDel(X##List* _list);            \
int X##ListPushH(X##List* _list, X* _data); \
int X##ListPushT(X##List* _list, X* _data); \
X* X##ListHead(X##List* _list);             \
X* X##ListTail(X##List* _list);             \
size_t X##ListCount(X##List* _list);        \
int X##ListIsEmpty(X##List* _list);         \
void X##ListPopH(X##List* _list);           \
void X##ListPopT(X##List* _list);           \
int X##ListPushHM(X##List* _list, size_t _vectNumOfElem, X* _dataVector); \
int X##ListPushTM(X##List* _list, size_t _vectNumOfElem, X* _dataVector); \
void X##ListPopHM(X##List* _list, size_t _vectNumOfElem); \
void X##ListPopTM(X##List* _list, size_t _vectNumOfElem); \
X* X##ListFindIf(X##List* _list, int (*_isMatch)(X* _data, void* _param), void* _param);



#define GENERATE_LIST_IMP(X)                \
X##List* X##ListNew(void)                   \
{ \
     return (X##List*)ListNew();            \
} \
\
void X##ListDel(X##List* _list)             \
{ \
    ListDel((List*)_list);                  \
} \
\
int X##ListPushH(X##List* _list, X* _data) \
{ \
    return ListPushH((List*)_list, _data);\
}\
\
int X##ListPushT(X##List* _list, X* _data) \
{ \
    return ListPushT((List*)_list, _data);  \
}\
\
X* X##ListHead(X##List* _list) \
{ \
    return (X*)ListHead((List*)_list); \
} \
\
X* X##ListTail(X##List* _list) \
{\
    return (X*)ListTail((List*)_list); \
}\
\
void X##ListPopH(X##List* _list) \
{  \
    ListPopH((List*)_list); \
}\
\
void X##ListPopT(X##List* _list) \
{\
    ListPopT((List*)_list);  \
}  \
\
size_t X##ListCount(X##List* _list) \
{ \
    return ListCount((List*) _list);    \
}   \
\
int X##ListIsEmpty(X##List* _list)   \
{ \
    return ListIsEmpty((List*) _list);  \
} \
X* X##ListFindIf(X##List* _list, int (*_isMatch)(X* _data, void* _param), void* _param) \
{  \
    return (X*)ListFindIf((List*)_list,(int(*)(void*, void*))(*_isMatch), _param);  \
} \
int X##ListPushHM(X##List* _list, size_t _vectNumOfElem, X* _dataVector) \
{\
    return ListPushHM((List*)_list, sizeof(X), _vectNumOfElem, _dataVector);\
}\
\
int X##ListPushTM(X##List* _list, size_t _vectNumOfElem, X* _dataVector) \
{ \
    return ListPushHM((List*)_list, sizeof(X), _vectNumOfElem, _dataVector); \
} \
\
void X##ListPopHM(X##List* _list, size_t _vectNumOfElem) \
{ \
    ListPopHM((List*)_list, _vectNumOfElem); \
} \
void X##ListPopTM(X##List* _list, size_t _vectNumOfElem) \
{ \
    ListPopTM((List*)_list, _vectNumOfElem); \
}

#endif /* LISTWRAP_H_INCLUDED   */
